#include "UDP.h"

// UDP 服务器初始化
struct sockaddr_in UDP_Init_Sever(in_port_t port, const char *s_addr, int * sock)
{
    // 1、创建用户数据报 套接字
    struct sockaddr_in soc_addr_in;
    int sok_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sok_fd)
    {
        perror("socket error:");
        return soc_addr_in; 
    }

    // 2、填充服务器网络信息结构体

    // struct sockaddr_in * soc_addr_in = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));

    soc_addr_in.sin_family = AF_INET;                // 结构体类型  IP4
    soc_addr_in.sin_port = htons(port);              // 端口号
    soc_addr_in.sin_addr.s_addr = inet_addr(s_addr); // IP地址
    socklen_t addrlen = sizeof(soc_addr_in);         // 结构体大小

    // 3、将套接字与服务器的网络信息结构体绑定
    if (-1 == bind(sok_fd, (struct sockaddr *)&soc_addr_in, addrlen))
    {
        perror("bind error:");
        close(sok_fd);
        return soc_addr_in;
    }

    // 返回数据

    *sock = sok_fd;
    return soc_addr_in;
}

// UDP 客户端初始化
struct sockaddr_in UDP_Init_Client(in_port_t port, const char *s_addr , int * sock)
{

    struct sockaddr_in soc_addr_in;

    // 1、创建用户数据报 套接字
    int sok_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sok_fd)
    {
        perror("socket error:");
        return soc_addr_in;
    }

    // 2、填充服务器网络信息结构体

    soc_addr_in.sin_family = AF_INET;                // 结构体类型  IP4
    soc_addr_in.sin_port = htons(port);              // 端口号
    soc_addr_in.sin_addr.s_addr = inet_addr(s_addr); // IP地址
    // socklen_t addrlen = sizeof(soc_addr_in);         // 结构体大小
    
    // 返回数据

    *sock = sok_fd;
    return soc_addr_in;

}

// 关闭套接字文件
void UDP_close(int  UDP_soc)
{
    close(UDP_soc);
}
